package com.jiyun.alipay.service.impl;

import com.github.wxpay.sdk.WXPay;
import com.jiyun.alipay.config.PayConfig;
import com.jiyun.alipay.service.WxPayService;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class WxPayServiceImpl implements WxPayService {

    /**
     *  下单操作
     * @param body 商品描述
     * @param outTradeNo 订单号
     * @param money 订单金额
     * @return
     */
    @Override
    public Map<String, String> createNative(String body, String outTradeNo, String money) {
        //定义返回值
        Map<String, String> resultMap = null;
        //创建微信支付对象
        PayConfig payConfig = new PayConfig();
        WXPay wxPay = new WXPay(payConfig);
        //封装请求参数
        Map<String, String> reqData = new HashMap<>();
        reqData.put("out_trade_no", outTradeNo);    //订单号
        reqData.put("total_fee", money);            //订单金额(单位分)
        reqData.put("body", body);             		//商品描述
        reqData.put("fee_type", "CNY");             //货币类型, CNY人民币
        reqData.put("spbill_create_ip", "127.0.0.1");   //终端IP(用户的客户端IP)
        reqData.put("notify_url", "http://www.example.com/wxpay/notify");   //支付成功后,通知的地址
        reqData.put("trade_type", "NATIVE");         // 支付类型,此处指定为扫码支付
        reqData.put("product_id", outTradeNo);         //商品ID,trade_type=NATIVE时，此参数必传。
        try {
            //把信息发送给微信
            resultMap = wxPay.unifiedOrder(reqData);
            System.out.println(resultMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultMap;
    }

    /**
     * 查询微信支付订单状态
     * 通过调用微信支付的订单查询接口，使用外部交易号来查询支付订单的状态
     * 此方法主要用于了解某个支付订单的当前状态，以便于后续的业务处理
     *
     * @param outTradeNo 外部交易号，用于唯一标识一个支付订单
     * @return 返回微信支付API返回的结果，包含订单状态和其他相关信息
     *         如果查询失败或者发生异常，则返回null
     */
    @Override
    public Map<String, String> queryNative(String outTradeNo) {
        // 初始化支付配置
        PayConfig config = new PayConfig();
        // 根据配置初始化微信支付对象
        WXPay wxpay = new WXPay(config);

        // 创建用于查询的参数数据
        Map<String, String> data = new HashMap<String, String>();
        // 设置查询条件：外部交易号
        data.put("out_trade_no", outTradeNo);

        // 尝试查询订单状态
        try {
            // 调用微信支付API进行订单查询
            Map<String, String> resp = wxpay.orderQuery(data);
            // 打印查询结果，便于调试
            System.out.println(resp);
            // 返回查询结果
            return resp;
        } catch (Exception e) {
            // 如果发生异常，打印异常信息
            e.printStackTrace();
        }
        // 如果查询失败或者发生异常，则返回null
        return null;
    }


    /**
     * 取消订单
     * @param outTradeNo 订单号
     * @return
     */
    @Override
    public Map<String, String> closeNative(String outTradeNo) {
        PayConfig config = new PayConfig();
        WXPay wxpay = new WXPay(config);

        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", outTradeNo);

        try {
            Map<String, String> resp = wxpay.closeOrder(data);
            System.out.println(resp);
            return resp;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}